import os
from collections import defaultdict


def count_tags_in_file(file_path):
    """统计单个文件中的标签出现次数"""
    tag_counts = defaultdict(int)

    with open(file_path, "r", encoding="utf-8") as f:
        for line in f:
            # 去除首尾空白字符
            line = line.strip()
            if not line:
                continue

            # 分割BVID和标签部分（处理多个制表符的情况）
            # 使用split('\t')并过滤空字符串，获取非空部分
            parts = [p for p in line.split("\t") if p.strip()]

            # 确保至少有BVID和标签两部分
            if len(parts) < 2:
                continue  # 跳过格式不正确的行

            # 提取标签部分并分割
            tags_str = parts[1].strip()
            tags = [tag.strip() for tag in tags_str.split(",") if tag.strip()]

            # 统计每个标签
            for tag in tags:
                tag_counts[tag] += 1

    return tag_counts


def process_all_files():
    """处理所有文件并生成统计结果"""
    # 创建输出目录（如果不存在）
    output_dir = "./count_tag"
    os.makedirs(output_dir, exist_ok=True)

    # 获取输入目录中的所有文件
    input_dir = "./set"
    if not os.path.exists(input_dir):
        print(f"错误：输入目录 '{input_dir}' 不存在")
        return

    for filename in os.listdir(input_dir):
        # 检查文件名是否符合 {tid}_bvids_tags_set.txt 格式
        if not filename.endswith("_bvids_tags_set.txt"):
            continue

        # 提取tid
        tid = filename.replace("_bvids_tags_set.txt", "")
        if not tid:
            continue

        # 处理文件
        input_file_path = os.path.join(input_dir, filename)
        print(f"正在处理文件: {filename}")

        # 统计标签
        tag_counts = count_tags_in_file(input_file_path)

        # 检查是否有统计结果
        if not tag_counts:
            print(f"警告：文件 {filename} 中未找到有效标签")

        # 按出现次数排序（从高到低）
        sorted_tags = sorted(tag_counts.items(), key=lambda x: x[1], reverse=True)

        # 输出到文件
        output_filename = f"{tid}_tags_count.txt"
        output_file_path = os.path.join(output_dir, output_filename)
        with open(output_file_path, "w", encoding="utf-8") as f:
            for tag, count in sorted_tags:
                f.write(f"{tag}\t{count}\n")

        print(f"文件 {filename} 处理完成，保存到：{output_filename}")


def main():
    process_all_files()
    print("所有文件处理完成")


if __name__ == "__main__":
    main()
